package org.alwayssuper.protocol.commons.transform.realtimev2016;

import org.alwayssuper.protostar.annotation.Field;
import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * 2016版车辆位置数据格式 (0x05)
 * 参考AICoding报文规则文档
 * @author alwaysSuper
 */
@ToString
@Data
@Accessors(chain = true)
public class VehiclePosition {
    @Field(length = 1, desc = "定位状态:bit0:GPS定位;bit1:北斗定位;其他预留;0xFE:异常;0xFF:无效")
    private int positioningStatus;
    
    @Field(length = 4, desc = "经度:精度0.000001°,偏移126°,0xFFFFFFFF无效")
    private int longitude;
    
    @Field(length = 4, desc = "纬度:精度0.000001°,偏移90°,0xFFFFFFFF无效")
    private int latitude;
    
    // =========================== 传输值与真实值转换方法 ===========================
    
    /**
     * 获取经度值 (°)
     * 传输值范围: 0~4294967295, 精度 0.000001°
     * 按协议标准: 经度值×10^6, 精确到百万分之一度
     * 0xFFFFFFFE: 异常, 0xFFFFFFFF: 无效
     */
    public double getLongitude() {
        if (longitude == 0xFFFFFFFE || longitude == 0xFFFFFFFF) {
            return Double.NaN;
        }
        return longitude / 1000000.0;
    }
    
    /**
     * 设置经度值 (°)
     * 值范围: -180°~+180°
     */
    public void setLongitude(double longitude) {
        if (Double.isNaN(longitude) || longitude < -180.0 || longitude > 180.0) {
            this.longitude = 0xFFFFFFFF; // 无效
        } else {
            this.longitude = (int) Math.round(longitude * 1000000);
        }
    }
    
    /**
     * 获取纬度值 (°)
     * 传输值范围: 0~4294967295, 精度 0.000001°
     * 按协议标准: 纬度值×10^6, 精确到百万分之一度
     * 0xFFFFFFFE: 异常, 0xFFFFFFFF: 无效
     */
    public double getLatitude() {
        if (latitude == 0xFFFFFFFE || latitude == 0xFFFFFFFF) {
            return Double.NaN;
        }
        return latitude / 1000000.0;
    }
    
    /**
     * 设置纬度值 (°)
     * 值范围: -90°~+90°
     */
    public void setLatitude(double latitude) {
        if (Double.isNaN(latitude) || latitude < -90.0 || latitude > 90.0) {
            this.latitude = 0xFFFFFFFF; // 无效
        } else {
            this.latitude = (int) Math.round(latitude * 1000000);
        }
    }
    
    /**
     * 检查是否为有效定位
     * bit0: 0=有效定位, 1=无效定位
     */
    public boolean isValidLocation() {
        return (positioningStatus & 0x01) == 0;
    }
    
    /**
     * 检查是否为北纬
     * bit1: 0=北纬, 1=南纬
     */
    public boolean isNorthLatitude() {
        return (positioningStatus & 0x02) == 0;
    }
    
    /**
     * 检查是否为东经
     * bit2: 0=东经, 1=西经
     */
    public boolean isEastLongitude() {
        return (positioningStatus & 0x04) == 0;
    }
    
    /**
     * 检查定位状态是否异常
     */
    public boolean isPositioningStatusAbnormal() {
        return positioningStatus == 0xFE;
    }
    
    /**
     * 检查定位状态是否无效
     */
    public boolean isPositioningStatusInvalid() {
        return positioningStatus == 0xFF;
    }
    
    /**
     * 检查经度是否异常
     */
    public boolean isLongitudeAbnormal() {
        return longitude == 0xFFFFFFFE;
    }
    
    /**
     * 检查经度是否无效
     */
    public boolean isLongitudeInvalid() {
        return longitude == 0xFFFFFFFF;
    }
    
    /**
     * 检查纬度是否异常
     */
    public boolean isLatitudeAbnormal() {
        return latitude == 0xFFFFFFFE;
    }
    
    /**
     * 检查纬度是否无效
     */
    public boolean isLatitudeInvalid() {
        return latitude == 0xFFFFFFFF;
    }
}